/**
 * 挂载注册所有的全局公共组件
 * 使用插件形式全局注册 符合 软件架构: 高内聚低耦合(模块化)
 */

// 在软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则是高内聚低耦合。从模块粒度来看，高内聚：尽可能类的每个成员方法只完成一件事（最大限度的聚合）； 低耦合：减少类内部，一个成员方法调用另一个成员方法。从类角度来看， 高内聚低耦合：减少类内部，对其他类的调用；从功能块来看 高内聚低耦合：减少模块之间的交互复杂度（接口数量，参数数据）即横向：类与类之间、模块与模块之间；纵向：层次之间；尽可能，内容内聚，数据耦合。

// 导入组件
import PageTools from './PageTools/index.vue'
// 导入复制过来的上传下载excel的第三方组件，要自己加一下name(组件内部没有name)
import UploadExcel from './UploadExcel/'
import ElDepSelect from './DeptsTreeData'
import UploadImg from './UploadImg'
import ScreenFull from './ScreenFull/index.vue'
import Lang from './lang/index.vue'

/**
 * 批量注册多个组件
 * 1. 把所有组件都放入一个数组中
 * 2. 循环数组注册所有组件
 */

const components = [PageTools, UploadExcel, ElDepSelect, UploadImg, ScreenFull, Lang]

// vue 插件写法: 声明一个对象，同时里面放一个install方法(能拿到 Vue构造函数)
export default {
  // install: function(){}
  install (Vue) {
    // install方法里面 可以挂载全局属性、注册全局组件、指令
    Vue.prototype.test = 'hello world!'
    // 注册全局组件
    // Vue.component('PageTools', PageTools)
    // 参数cp就是遍历的每一项组件对象，可以通过cp.name拿到name值=>提前准备好的 name 即用来注册的组件名称
    components.forEach((cp) => {
      Vue.component(cp.name, cp)
    })
  }
}
